package com.xxxx.sso.service.ssoservice;




//    第一件事件：验证用户信息是否正确，并将登录成功的用户信息保存到Redis数据库中。
//    第二件事件：负责判断用户令牌是否过期，若没有则刷新令牌存活时间。
//    第三件事件：负责从Redis数据库中删除用户信息。


import com.baomidou.mybatisplus.core.toolkit.StringUtils;

import com.xxxx.sso.pojo.Admin;
import com.xxxx.common.utils.JsonUtil;
import com.xxxx.common.utils.Md5Util02;
import com.xxxx.common.utils.UUIDUtil;
import com.xxxx.sso.exceptions.AssertUtil;
import com.xxxx.sso.mapper.AdminMapper;
import com.xxxx.sso.service.IAdminService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.concurrent.TimeUnit;


@Service(version = "1.0")
@Component
public class AdminService implements IAdminService {

    @Resource
    private AdminMapper adminMapper;

    @Resource
    private RedisTemplate<String,String> redisTemplate;
    @Value("${user.ticket}")
    private String userTicket;
    //判断用户名和密码
    @Override
    public String login(Admin admin) {
        AssertUtil.isTrue(StringUtils.isBlank(admin.getUserName()), "用户名不能为空！！！");
        AssertUtil.isTrue(StringUtils.isBlank(admin.getPassword()), "密码不能为空！！！");

        //去数据库中查询，判断用户名是否存在
        Admin user = adminMapper.selectAdminByAdminName(admin.getUserName());
        AssertUtil.isTrue(user == null, "用户名不存在");
        System.out.println("数据库USER=============="+user.toString());

        //如果用户存在，判断密码是否正确
        AssertUtil.isTrue(!user.getPassword().equalsIgnoreCase(Md5Util02.getMd5WithSalt(admin.getPassword(), user.getEcSalt())),"密码不正确,请重新输入！！！");

        //用户名和密码正确，返回票据信息
        //生成票据信息存入ticket,页面借助cookie存储票据ticket
        ValueOperations<String, String> operations = redisTemplate.opsForValue();
        String ticket = UUIDUtil.getUUID();
        // 将ticket存入redis中，并设置30分钟过期
        operations.set(userTicket + ":" + ticket, JsonUtil.object2JsonStr(user), 30, TimeUnit.MINUTES);

        return ticket;
    }

    //判断票据信息
    @Override
    public Admin validate(String ticket) {
        //判断票据是否为空
       AssertUtil.isTrue(StringUtils.isBlank(ticket),"你没有票！！！");
       //首先获得票据
        ValueOperations<String,String> valueOperations = redisTemplate.opsForValue();
        String s = valueOperations.get(userTicket+":" + ticket);
        System.out.println("s=========================="+s);
        //判断票据是否有效
        AssertUtil.isTrue(StringUtils.isBlank(s),"你没有票！！！");
        return JsonUtil.jsonStr2Object(s,Admin.class );
    }


    //用户退出
    @Override
    public void logout(String ticket) {
        redisTemplate.delete(userTicket+":"+ticket);
    }

}
